package control;

import java.util.List;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import model.Consulta;
import model.Produto;
import model.TipoConsulta;

@WebService()
public class ProdutoControle {

    @WebMethod
    public boolean incluir(@WebParam(name = "wp_Produto") Produto wp_Produto) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("furb");
        EntityManager em = emf.createEntityManager();

        em.getTransaction().begin();

        em.persist(wp_Produto);
        em.getTransaction().commit();

        em.close();
        emf.close();

        System.out.println("Chamou a rotina de inclusão do web service");

        return true;
    }

    @WebMethod
    public boolean alterar(@WebParam(name = "wp_Produto") Produto wp_Produto) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("furb");
        EntityManager em = emf.createEntityManager();

        em.getTransaction().begin();

        em.merge(wp_Produto);
        em.getTransaction().commit();

        em.close();
        emf.close();

        System.out.println("Chamou a rotina de alteração do web service");

        return true;
    }

    @WebMethod
    public List<Produto> consultar(@WebParam(name = "wp_Consulta") Consulta wp_Consulta) {
        System.out.println("Chamou a rotina de pesquisa do web service");
        System.out.println("Tipo: " + wp_Consulta.getTipo());
        System.out.println("Valor: " + wp_Consulta.getParametro());
        if (wp_Consulta.getTipo() == TipoConsulta.TODOS) {

            return consultarTodos();

        } else if (wp_Consulta.getTipo() == TipoConsulta.CODIGO) {

            return consultarCodigo(wp_Consulta.getParametro());

        } else if (wp_Consulta.getTipo() == TipoConsulta.DESCRICAO) {

            return consultarDescricao(wp_Consulta.getParametro());

        }
        throw new UnsupportedOperationException("Tipo de pesquisa não suportado!");
    }

    private List<Produto> consultarTodos() {
        return consultarBase(TipoConsulta.TODOS, "", "");
    }

    private List<Produto> consultarCodigo(String valor) {
        return consultarBase(TipoConsulta.CODIGO, "codigo", valor.trim());
    }

    private List<Produto> consultarDescricao(String valor) {
        return consultarBase(TipoConsulta.DESCRICAO, "descricao", valor.trim());
    }

    private List<Produto> consultarBase(TipoConsulta tipo, String coluna, String valor) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("furb");
        EntityManager em = emf.createEntityManager();

        String sql = "select p from Produto p";
        if (!coluna.trim().equals("")) {
            sql = sql.concat(" where p." + coluna + " = :" + coluna);
        }

        System.out.println("QUERY: " + sql);

        Query q = (Query) em.createQuery(sql);
        if (!coluna.trim().equals("")) {
            if (tipo == TipoConsulta.CODIGO) {
                q.setParameter(coluna, new Integer(valor));
            } else {
                q.setParameter(coluna, valor);
            }
        }
        List<Produto> retorno = q.getResultList();

        em.close();
        emf.close();

        return retorno;
    }
}
